Асинхронное программирование, воркшоп

📄 Фоновые задачи

⚙ IHostedService

startAsync - когда приложение стартует

stopAsync - когда отключается

  • Чтобы выполнять фоновую работу, требуется выполнять задачу асинхронно, т.к. если вечно крутиться в startAsync то остальное приложение не стартанет, т.к. запуск происходит основной поток
  • Если мы знаем что асинхронная задача, например в данном случае фоновая работа будет происходить долго, то не очень хорошо делать Task.Run(), т.к. один поток из тредпула будет постоянно занят, зачем это нужно тредпулу
    Можно воспользоваться Task.Factory.StartNew(() ⇒ {}, Task.CreatingOptions.LongRunning), тогда будет выделен отдельный тред не затрудняющий работу пулла.
  • Чтобы не долбать можно сделать BackgroundService и все будет тоже самое что было выше, но меньше кода
  • Если их регистрировать через стартап, то они запустятся раньше чем само приложение

⚙ Timer

_timer = new Timer(async state => {
		// some cicle work
}, state, TimeSpan.Zero, TimeSpan.FromSeconds(5));

Эта штука будет запускать начав спустя третий параметр, циклично через время указанное в 4ом параметре.

async void можно использовать только в качестве делегата

⚙ IServiceProvider

Если мы хотим достать сервис из DI, но по времени жизни он не доступен то можно через конструктор пробрасывать IServiceProvider

⚙ CancellationToken

  • Это структура

Как она работает:

  • В ней есть ридонли поле на уже класс CancellationTokenSource
  • Т.к. это структура, при передаче в метод будет происходить копирование, но ссылка на класс CancellationTokenSource сохранится
  • Когда мы создаем CancellationToken.None, мы создаем без ссылки на CancellationTokenSource, а значит он не сможет отмениться
  • При создании CancellationTokenSource мы можем задать отмену через какое то время
  • При создании CancellationTokenSource мы можем связать его с каким токеном, и он сработает когда сработает токен.
  • Мы можем принудительно отменить все привязанные токены через token.Cancel()
  • Token бросает два вида эксепшенов, разница хз, но ловить надо оба, разныи библиотеки используют разные эксепшны
  • Выход может совершаться через эксепшн, если такой метод проверки запущен
  • Просто ифом можно проверить и как-то обработать

В эндпоинтах ОЧЕНЬ нужно писать cancellationToken

В БД откатывать можно через транзакции